package cn.dm.example.syncContainer;

import java.util.Iterator;
import java.util.Vector;

public class VectorExample3 {

    // java.util.ConcurrentModificationException
    private static void test1(Vector<Integer> v1) { // foreach
        for (Integer i : v1) {
            if (i.equals(3)) {
                v1.remove(i);
            }
        }
    }

    // java.util.ConcurrentModificationException
    private static void test2(Vector<Integer> v1) { // iterator
        Iterator<Integer> iterator = v1.iterator();
        while (iterator.hasNext()) {
            Integer i = iterator.next();
            if (i.equals(3)) {
                v1.remove(i);
            }
        }
    }

    // success
    private static void test3(Vector<Integer> v1) { // for
        for (int i = 0; i < v1.size(); i++) {
            if (v1.get(i).equals(3)) {
                v1.remove(i);
            }
        }
    }

    public static void main(String[] args) {

        Vector<Integer> vector = new Vector<>();
        vector.add(1);
        vector.add(2);
        vector.add(3);


        // test1(vector);   // java.util.ConcurrentModificationException
        // test2(vector);     // java.util.ConcurrentModificationException
         // test3(vector);   // success


        vector.forEach(item -> System.out.println(item));

        /**
         * 总结：
         * 遍历的时候不要去更新,尤其是 foreach 和 iterator,可以把需要修改的值先好做标记记录下来,等遍历完再操作(也就是两步分开执行)
         * 若是多线程情况下共享集合时还去修改,出现 ConcurrentModificationException 异常概率更大
         *
         * 上面还是使用的线程安全容器Vector,使用foreach 和 iterator这俩方法都不行,只有for可以
         * 若是再换成普通容器ArrayList等,那更不行了！！！
         */
    }
}
